#include "libDatos.h"

uint8_t estaDisponible(uint8_t chunskBitmap[CHUNKSIZE], uint64_t pos){
	uint64_t numByte = div(pos, 8).quot;
	uint64_t numBit = div(pos,8).rem;
	return div(div(chunskBitmap[numByte], potencia(2,8-numBit)).rem, potencia(2,8-numBit-1)).quot;
}


uint64_t chunksDisponiblesContinuos(uint8_t *chunksBitmap, uint64_t posicion){
	uint64_t contador = 1;
	int8_t disp = 1;
	while(disp){
		disp = estaDisponible(chunksBitmap, posicion);
		if(disp) contador ++;
		posicion += 1;
	}
	return contador;
}


uint64_t chunskOcupadosContinuos(uint8_t *chunksBitmap, uint64_t posicion){
	uint64_t contador = 1;
	int8_t ocupado = 1;
	while(ocupado){
		ocupado = !(estaDisponible(chunksBitmap, posicion));
		if(ocupado) contador ++;
		posicion += 1;
	}
	return contador;
}

espacio_t algoritmoWorstFit(char *memoria, uint8_t *chunksBitMap, uint64_t espacioRequerido){
	espacio_t espacio;
	espacio.posicion = -1;
	espacio.tamanio = -1;
	uint64_t i = 0;
	while(memoria[i] != '\0'){
		if(estaDisponible(chunksBitMap, i)){
			uint64_t cantidad = chunksDisponiblesContinuos(chunksBitMap, i);
			if(cantidad > espacio.tamanio){
				espacio.tamanio = cantidad;
				espacio.posicion = i;
			}
			i += cantidad;
		} else{
			i+= chunskOcupadosContinuos(chunksBitMap, i);
		}
	}

	return espacio;
}
